程序员我的技术文章

Python_6_类

2018-08-24  本文已影响53人  芭比哪吒

一、类的定义

# 定义类
class People:
    # 定义基本属性
    name = ""
    age = 0
    # 定义私有属性
    _sex = ""

    # 定义构造方法
    # ps:self 代表的是类的实例,代表当前对象的地址,而 self.class 则指向类
    # self 不是 python 关键字,我们把他换成 mmp 也是可以正常执行的
    def __init__(self, name, age, sex):
        self.name = name
        self.age = age
        self._sex = sex

    # 定义方法
    def speak(self):
        print("{name}说,我叫{name},今年{age}岁".format(name=self.name, age=self.age))

二、类实例化

# 实例化
x = People("李四", 12, "男")
# 调用类方法
x.speak()

三、继承

##继承
class Student(People):
    # 多态
    grade = 0

    def __init__(self, name, age, sex, grade):
        # 调用父类的构造方法
        People.__init__(self, name, age, sex)
        self.grade = grade

    # 覆盖父类的方法
    def speak(self):
        print("{name}说,我是一个学生,我在读{grade}年级,我今年{age}岁".format(name=self.name, grade=self.grade, age=self.age))


stu = Student("泰迪", 12, "男", 2)
stu.speak()

四、多继承

需要注意圆括号中父类的顺序,若是父类中有相同的方法名,而在子类使用时未指定,python从左至右搜索,即方法在子类中未找到时,从左到右查找父类中是否包含方法。
所以,方法名同,默认调用的是在括号中排前地父类的方法

# 人类
class People:
    name = ""
    age = 0

    def __init__(self, name, age):
        self.age = age
        self.name = name

    def speak(self):
        print("my name is {name},{age} years old.".format(name=self.name, age=self.age))


# p = People("LiLei", 23)
# p.speak()


# 演说家类
class Speaker:
    topic = ""

    def __init__(self, topic):
        self.topic = topic

    def speak(self):
        print("I am a speaker,topic is {topic}".format(topic=self.topic))


class sample1(People, Speaker):
    def __init__(self, name, age, topic):
        People.__init__(self, name, age)
        Speaker.__init__(self, topic)


class sample2(Speaker, People):
    def __init__(self, name, age, topic):
        People.__init__(self, name, age)
        Speaker.__init__(self, topic)


test1 = sample1("LiLe", 23, "NBA")
test1.speak()

test2 = sample2("LiLe", 23, "NBA")
test2.speak()

输出结果
test1=>my name is LiLe,23 years old.
test2=>I am a speaker,topic is NBA

五、方法重写

如果父类方法的功能不足,可以在子类中重新编写这个方法

class car:
    def run(self):
        print("the fastest Speed 20 km/h")


class SportsCar(car):
    def run(self):
        print("the fastest Speed 200 km/h")


test = SportsCar()
test.run()

super(SportsCar,test).run()

通过super 则可以通过子类实例,调用已经被覆盖的父类方法

六、类属性与方法

私有属性

两个下划线开头,声明该属性为私有


私有的字段不能在类外被访问

类的方法

在类地内部,使用 def 关键字来定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数self 代表的是类的实例
self 的名字并不是规定死的,也可以使用 this,但是最好还是按照约定是用 self

私有方法

__eat:两个下划线开头,声明该方法为私有方法,只能在类的内部调用 ,不能在类地外部调用。self.__eat

类的专有方法

init : 构造函数,在生成对象时调用
del : 析构函数,释放对象时使用
repr : 打印,转换
setitem : 按照索引赋值
getitem: 按照索引获取值
len: 获得长度
cmp: 比较运算
call: 函数调用
add: 加运算
sub: 减运算
mul: 乘运算
div: 除运算
mod: 求余运算
pow: 乘方
ps:类的专有方法一样是可以被重载

上一篇下一篇

猜你喜欢

热点阅读