饮冰三年-人工智能-Python-18Python面向对象

1 类与实例对方法和属性的修改

class Chinese:
    # 这是一个Chinese的类
    #定义一个类属性,又称为静态数据或者静态变量,相当于C#中的static
    country="China"
    # 定义一个初始化函数,
    def __init__(self,name,age,gender):
        self.name=name
        self.age=age
        self.gender=gender
    #定义一个方法
    def play(self,ballName):
        print('%s 正在打 %s' %(self.name,ballName))

#1类属性
print("----------开始修改类属性")
#1.1 查看类属性
print(Chinese.country) #China
#1.2 修改类属性
Chinese.country="中华人民共和国"
print(Chinese.country) #中华人民共和国
#1.3 删除类属性
del Chinese.country
print(Chinese.__dict__)
#{'__module__': '__main__', '__init__': <function Chinese.__init__ at 0x0000000001D30EA0>, 'play': <function Chinese.play at 0x000000000247C7B8>, '__dict__': <attribute '__dict__' of 'Chinese' objects>, '__weakref__': <attribute '__weakref__' of 'Chinese' objects>, '__doc__': None}
#1.4 添加类属性
Chinese.country="中国"
print(Chinese.__dict__)
#{'__module__': '__main__', '__init__': <function Chinese.__init__ at 0x0000000002300EA0>, 'play': <function Chinese.play at 0x000000000250C7B8>, '__dict__': <attribute '__dict__' of 'Chinese' objects>, '__weakref__': <attribute '__weakref__' of 'Chinese' objects>, '__doc__': None, 'country': '中国'}

#2方法属性
print("----------开始修改方法属性")
#2.1 查看方法属性
p1=Chinese('张三',18,"")
Chinese.play(p1,'篮球') #张三 正在打 篮球
#2.2 修改方法属性
def play(self,ballName,address):
    print('%s 在%s打%s' %(self.name,address,ballName))
Chinese.play=play
Chinese.play(p1,'篮球','操场') #张三 在操场打篮球
#2.3 删除类属性
del Chinese.play
print(Chinese.__dict__)
#{'__module__': '__main__', '__init__': <function Chinese.__init__ at 0x0000000001D40EA0>, '__dict__': <attribute '__dict__' of 'Chinese' objects>, '__weakref__': <attribute '__weakref__' of 'Chinese' objects>, '__doc__': None, 'country': '中国'}
#2.4 添加方法
def eat(self,food):
    print("%s 正在吃 %s" %(self.name,food))
Chinese.eat=eat
print(Chinese.__dict__)
# {'__module__': '__main__', '__init__': <function Chinese.__init__ at 0x0000000001D40EA0>, '__dict__': <attribute '__dict__' of 'Chinese' objects>, '__weakref__': <attribute '__weakref__' of 'Chinese' objects>, '__doc__': None, 'country': '中国', 'eat': <function eat at 0x0000000001DFC7B8>}

#3实例类属性
print("----------开始修改实例类属性")
#3.1 查看实例类属性
p=Chinese('张三',18,"")
print(p.country) #中国
#3.2 修改实例类属性
p.country="中华人民共和国"
print(p.country) #中华人民共和国
#3.3 删除实例类属性
del p.country
print(p.__dict__)
#{'name': '张三', 'age': 18, 'gender': '男'}
# 3.4 添加类属性
p.country="中国"
print(p.__dict__)
#{'name': '张三', 'age': 18, 'gender': '男', 'country': '中国'}

print("----------开始修改实例属性")
#4.1 查看实例类属性
p=Chinese('张三',18,"")
print(p.name) #张三
#4.2 修改实例类属性
p.name="张三三"
print(p.name) #张三三
#4.3 删除实例类属性
del p.name
print(p.__dict__)
#{'age': 18, 'gender': '男'}
# 4.4 添加类属性
p.name="张三三"
print(p.__dict__)
#{'age': 18, 'gender': '男', 'name': '张三三'}

print("----------开始修改实例方法")
#4.1 查看实例方法
p=Chinese('张三',18,"")
p.eat('包子')
# 张三 正在吃 包子
#4.2 修改实例类属性
def eat(self,food,address):
    print('%s在%s吃%s' %(self.name,address,food))
p.eat=eat
p.name="张三三"
p.eat(p,"包子","食堂") #张三三在食堂吃包子
#4.3 删除实例类属性
del p.eat
print(p.__dict__)
#{'name': '张三三', 'age': 18, 'gender': '男'}
# 4.4 添加实例方法属性
def study(self,cont):
    print('%s学%s' % (self.name,cont))
p.study = study
p.study(p,'python')
print(p.__dict__)
#张三三学python
# {'name': '张三三', 'age': 18, 'gender': '男', 'study': <function study at 0x0000000002526B70>}
ViewCode

2 静态属性、静态方法、类方法

class Room:
    owner="China"
    # 这是一个房间的类
    def __init__(self,name,width,length,height):
        self.name=name
        self.width=width
        self.length =length
        self.height=height
    @property
    # 这是一个方法,但是通过@property装饰后,就变成了一个静态方法,可以通过.方法名调用
    def getArea(self):
        return self.width*self.length
    @classmethod
    # 这是一个方法,但是通过@classmethod装饰后,就变成了一个类方法,可以类调用,不用实例化
    def getOwner(cls):
        print("房产所有者"+cls.owner)
    @staticmethod
    # 这是一个方法,但是通过@staticmethod装饰后,就变成了一个静态方法,可以在调用处直接传递参数
    # 用户输入想要的面积和折扣,可以计算出价格
    def getPrice(area,discount):
       return area*20000*discount/10

r1=Room("天字一号房",10,20,2)
print('房间面积'+str(r1.getArea)) #房间面积200
#类方法:可以通过类名直接调用方法
Room.getOwner() #房产所有者China
#静态方法,可以传递一些与类关联不大的数据
print(r1.getPrice(r1.getArea,9)) #3600000.0
View Code

3 组合(大类包含小类)

class School:
    # 这是一个学校类
    def __init__(self,name,address):
        self.name=name
        self.address=address
class Courses:
    # 这是一个课程类,组合了一个学校
    def __init__(self, name, cycle,price,schoolObj):
        self.name = name
        self.cycle = cycle
        self.price = price
        self.school = schoolObj
    def getInfo(self):
        print('%s 正在开设 %s' %(self.school.name,self.name))
school = School('北大','北京')
Courses('python','100','10',school).getInfo()
View Code

4 继承

#继承一:抽象出共有的父类,实现继承
class Animal:
    def __init__(self,name):
        self.name=name
    def eat(self):
        print('%s会吃' %(self.name))
    def bark(self):
        print('%s会叫' %self.name)
class Dog(Animal):
    pass
class Cat(Animal):
    pass

dog=Dog("小黄")
dog.bark()
cat = Cat("伊丽莎白")
cat.eat()
#继承二:但是猫和狗的叫声不同,所以常用的是接口继承(父类只提供一个规范,子类在调用时需要实现这些规范)
# 如果是抽象方法,子类必须实现
import abc
class Animal(metaclass=abc.ABCMeta):
    def __init__(self,name):
        self.name=name
    @abc.abstractclassmethod
    def eat(self):
        print('%s会吃' %(self.name))
    def bark(self):
        print('%s会叫' %self.name)
class Dog(Animal):
    def bark(self):
        print('%s会汪汪叫' %self.name)
    #如果是抽象方法,子类必须实现
    def eat(self):
        pass
class Cat(Animal):
    def eat(self):
        print('%s会吃鱼儿' %self.name)

dog=Dog("小黄")
dog.bark()
cat = Cat("伊丽莎白")
cat.eat()
两种继承方式

  4.1 继承顺序

  当类是经典类(class C1:)时,多继承情况下,深度优先(依次找到根节点)

  当类是新式类(class C1(object):)时,多继承情况下,广度优先(最后一次才找到根节点)

  原理:python会计算一个方法解析顺序(MRO)列表,可通过print(类名.__mro__)查看

猜你喜欢

转载自www.cnblogs.com/YK2012/p/9748654.html