Python小推车python学习

Python学习打call第二十九天:面向对象

2019-03-01  本文已影响55人  暖A暖

1.类和对象的定义

class 类的名称:
    语句块

# Student就是类对象,num是类变量,showNum是方法, self为类对象的实例, 类名称一般需要大写

class Student:
    num = 100
    def showNum(self):
        return 200

print(Student.num)       # 100
print(Student.showNum)   # <function Student.showNum at 0x009A9468>

2.实例的定义

3.什么是实例化

class Student:
    num = 100
    def __init__(self):
        self.name = '张三'
    def showClass(self):
        return '李四'

print(Student.num)         # 100
print(Student.showClass)   # <function Student.showClass at 0x008794F8>
stu = Student()            # 实例化,会调用__init__方法,self会自动传递,不能有return返回值
print(stu.name)            # 张三

4.类变量和实例变量

# 实例变量是实例特有的,类变量是类和实例共有的
class Student:
    num = 100
    def __init__(self, name):
        self.name = name

    def showClass(self):
        return 200

print(Student.num)
print(Student.showClass)

stu = Student('张三') # 实例化,会调用__init__方法,self会自动传递,不能有return返回值
print(stu.name) # 实例变量
print(stu.num) # 类变量

stu1 = Student('Petter')
print(stu1.name)
print(stu1.num)

5.类方法和实例方法

class Student:
    num = 100
    def __init__(self, name):
        self.name = name

    def showClass(self):
        return '张三'

    @classmethod
    def add(cls):
        print(cls)

stu = Student('张三')    # 实例化,会调用__init__方法,self会自动传递,不能有return返回值
print(stu.name)          # 实例变量 输出:张三
print(stu.num)           # 类变量  输出: 100

stu1 = Student('李四')
print(stu1.name)        # 输出:李四
print(stu1.num)         # 输出:100

print(stu.__dict__)     # 类的属性保存在自己的字典中,包括类变量和方法
print(stu.__dict__)     # 实例的属性保存在自己的字典中,包括实例的变量

stu.add()              # 类方法可以被实例对象调用  输出:<class '__main__.Student'>
stu.__class__.add()

print(Student.showClass())     # 报错,实例方法不可以被类对象调用
print(Student.name)            # 实例可以访问类的属性,类无法访问实例的属性 

6.静态方法

class Student:

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

    def showClass(self):
        print('张三')

    @classmethod
    def add(cls):
        print(cls)

    @staticmethod
    def sub():
        print('static')

stu = Student('李四')
stu.sub()  # 实例可以调用静态方法    输出:static
stu.add()   # 实例可以调用类方法      输出:<class '__main__.Student'>
stu.showClass() # 实例可以调用对象方法  输出:张三

Student.sub()   # 类可以调用静态方法  输出:static
Student.add()    # 类可以调用类方法   输出:<class '__main__.Student'>

Student.showClass()  # 报错,类不可以调用对象方法 

7.私有属性和保护属性

8.属性装饰器


class Student:
    num = 100
    def __init__(self, name):
        self.__name = name

    @property
    def name(self):
        return self.__name

    @name.setter
    def name(self, name):
        self.__name = name

    @name.deleter
    def name(self):
        del self.__name

stu = Student('张三')
print(stu.name)     # 输出:张三

stu.name = '李四'
print(stu.name)     # 输出:李四 


# 2:属性装饰器第二种写法
class Student:
    def __init__(self, name):
        self.__name = name

    def get_name(self):
        return self.__name

    def set_name(self, value):
        self.__name = value

    def del_name(self):
        del self.__name
        print('实例的属性被删除了')
    # 这里表示property是用来修饰name这个属性的
    name = property(fget=get_name, fset=set_name, fdel=del_name, doc='hello')

stu = Student('张三')
print(stu.name)    # 张三

stu.name = '李四'
print(stu.name)   # 李四 

9.类的继承

class Animal:
    def __init__(self):
        self.type = 'animal'

    def eat(self):
        print('{} 吃'.format(self.__class__.__name__))   # Animal 吃

class Person(Animal):
    def talk(self):
        print('讲话')

animal = Animal()
animal.eat()

print(animal.type) # animal
animal.talk() # 报错,父类不可以调用子类的方法

person = Person()
print(person.type)  # animal

person.eat()       # Person 吃
person.talk()      # 讲话

10.属性查找顺序

class Animal:
    __name = 'animal'
    def __init__(self):
        self.type = 'animal'

    def eat(self):
        print('{} eat'.format(self.__class__.__name__))

class Person(Animal):
    def talk(self):
        print('talk')

person = Person()
print(person.__name)

11.方法重写

# 1:子类可以覆盖父类的方法,可以在覆盖的方法中调用父类的方法
# 父类的类方法,静态方法也可以被覆盖
class Animal:
    def __init__(self):
        self.type = 'animal'

    def eat(self):
        print('{} eat'.format(self.__class__.__name__))

class Person(Animal):
    def eat(self):
        print('洗手')  # 洗手
        print('{} eat'.format(self.__class__.__name__))  # Person eat
        super().eat()  # 调用父类的方法                    # Person eat
        # super(Person, self).eat()   等价于 super().eat()

person = Person()
person.eat()

# 2: 继承中的init方法
class Animal:
    def __init__(self):
        self.one = 'one'

class Person(Animal):
    def __init__(self):
        self.two = 'two'
        self.three = 'three'

    def show(self):
        print(self.one, self.two, self.three)

person = Person()
print(person.__dict__)  # {'two': 'two', 'three': 'three'}
# person.show()    # person没有three这个属性

# 3:代码修改
# 如果父类有__init__方法,且子类也有__init__方法,最好在子类的__init__方法中手动调用父类的__init__方法
class Animal:
    def __init__(self):
        self.one = 'one'

class Person(Animal):
    def __init__(self):
        self.two = 'two'
        self.three = 'three'
        super().__init__()  # 父类init方法的调用写在子类的什么地方也有讲究

    def show(self):
        print(self.one, self.two, self.three)

person = Person()
print(person.__dict__)
print(person.one) 

12.装饰器

13.Mixin

14.Mixin类的注意点

参考:https://www.9xkd.com/user/plan-view.html?id=1853344716

上一篇下一篇

猜你喜欢

热点阅读