您好,登录后才能下订单哦!
# class MyClass:
# """A example class"""
# age = 300
# def __init__(self,name,age):
# self.name = name
# self.age = age
# def showage(self):
# print("{}is a student{}".format(self.name,self.age))
# tom = MyClass("lijiabin",18) #实例化 tom是实例
#
# print(tom.age,tom.name) ##tom.age是实例的变量
# print(MyClass.age)
# tom.showage() #实例化后每个实例可以享用对象的方法 类实例化后,得到一个实例对象,实例对象会绑定方法,调用方法时采用jerry.showage()的方式。
#通俗的说就是 实例在调用类的方法时候 自身的属性特点也会一起带着!!!!!!!!!!!
#实例变量和类变量
##tom.age是实例的变量
#实例变量是每一个实例自己的变量,是自己独有的;类变量是类的变量,是类的所有实例共享的属性和方法
# 特殊属性 含义
# __name__ 对象名
# __class__ 对象的类型
# __dict__ 对象的属性的字典
# print(MyClass.__name__)
# print(MyClass.__class__)
# print(type(MyClass)) ##等价于.__class__
# print(MyClass.__dict__.items()) ##__dict__返回一个字典
# print("++++++++++++++++++++++++++")
# tom = MyClass("tp",19)
# print(tom.__class__)
# print(tom.__dict__) ##实例的字典和属性 通俗的讲就是tom属于人类 tom的属性在自己的×××上
# print(type(tom.__class__.__name__))#tom的类的名字 就是一个连环拼接,返回一个字符串
#
#
#
# class Person:
# age = 3
# height = 170
# def __init__(self, name, age=18):
# self.name = name
# self.age = age
# tom = Person('Tom') # 实例化、初始化 ¥¥¥¥¥¥¥¥每一个个体调用的时候必须先初始化
# jerry = Person('Jerry', 20)
# Person.age = 30
# print(Person.age, tom.age, jerry.age) # 输出什么结果
#
# print(Person.height, tom.height, jerry.height) # 输出什么结果
# jerry.height = 175 ###给个体增加属性 可以在个体的字典里查到
# print(Person.height, tom.height, jerry.height) # 输出什么结果
# # tom.height += 10
# # print(Person.height, tom.height, jerry.height) # 输出什么结果
# # Person.height += 15
# # print(Person.height, tom.height, jerry.height) # 输出什么结果
# Person.weight = 70
# print(Person.weight, tom.weight, jerry.weight) # 输出什么结果
# # print(tom.__dict__['height'])
# print(tom.weight) # 可以吗
# 指的是实例使用 .点号 来访问属性,会先找自己的 __dict__ ,如果没有,然后通过属性 __class__ 找到自己的
# 类,再去类的 __dict__ 中找
# 注意,如果实例使用 __dict__[变量名] 访问变量,将不会按照上面的查找顺序找变量了,这是指明使用字典的key
# 查找,不是属性查找。
#给一个类增加一个属性可以写入 也可以通过之前学过的装饰器来完成 想装饰器的作用就是给一个函数加一个发卡 包装一下这个函数
# 注意书写等价式
# def decorate(name): #增加姓名
# def inner(cls): #class
# cls.Name = name
# return cls
# return inner
#
# @decorate("tom") # Person = decorate("tom")(Person)-> inner(Person)
# class Person:
# Age = 11
#
# print(Person.__dict__)
#
#类方法
# class Person:
# @classmethod #
# def class_method(cls): # cls是什么 是类的方法
# print('class = {0.__name__} ({0})'.format(cls))
# cls.HEIGHT = 170
#1. 在类定义中,使用@classmethod装饰器修饰的方法
# 2. 必须至少有一个参数,且第一个参数留给了cls,cls指代调用者即类对象自身
# 3. cls这个标识符可以是任意合法名称,但是为了易读,请不要修改
# 4. 通过cls可以直接操作类的属性
#
# Person.class_method()
# print(Person.__dict__)
# 类方法的调用
# class Person:
# def normal_method():
# print('normal')
# def method(self):
# print("{}'s method".format(self))
# @classmethod #类方法 给类定义的属性
# def class_method(cls): # cls是什么
# print('class = {0.__name__} ({0})'.format(cls))
# cls.HEIGHT = 170
# @staticmethod #静态方法 无需增加参数 静态方法,只是表明这个方法属于这个名词空间。函数归在一起,方便组织管理
# def static_methd():
# print('Person.HEIGHT')
# print('~~~~类访问')
# print(1,Person.normal_method()) # 可以吗
# print(2, Person.method()) # 可以吗 类中的方法是给实例准备的 要穿self才能用 通俗的说就是人类不能去用个体户的功能,他是每个个体独有的 要是人类能看 所有个体就都能看 有违逻辑
# print(3, Person.class_method()) # 可以吗
# print(4, Person.static_methd()) # 可以吗 keyi
# print(Person.__dict__)
# print('~~~~实例访问')
# print('tom----')
# tom = Person()
# # print(1, tom.normal_method()) # 可以吗 不可以 实例必须给定参数 否则不能调用
# print(2, tom.method()) # 可以吗
# print(3, tom.class_method()) # 可以吗?
# print(4, tom.static_methd()) # 可以吗
# print('jerry----')
# jerry = Person()
# # print(1, jerry.normal_method()) # 可以吗
# print(2, jerry.method()) # 可以吗
# print(3, jerry.class_method()) # 可以吗?
# print(4, jerry.static_methd()) # 可以吗
# 总结:
# 类除了普通方法都可以调用,普通方法需要对象的实例作为第一参数。
# 实例可以调用所有类中定义的方法(包括类方法、静态方法),普通方法传入实例自身,静态方法和类方法需要找
# 到实例的类。
# 通过方法控制实例的属性 可以学习一下
# class Person:
# def __init__(self, name, age=18):
# self.name = name
# self.age = age
# def growup(self, i=1):
# if i > 0 and i < 150: # 控制逻辑
# self.age += i
# p1 = Person('tom')
# p1.growup(20) # 正常的范围
# print(p1.age)
# p1.age = 160 # 超过了范围,并绕过了控制逻辑
# print(p1.age)
# 补丁
# 可以通过修改或者替换类的成员。使用者调用的方式没有改变,但是,类提供的功能可能已经改变了。
# 猴子补丁(Monkey Patch):
# 在运行时,对属性、方法、函数等进行动态替换。
# 其目的往往是为了通过替换、修改来增强、扩展原有代码的能力。
# 黑魔法,慎用。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。