实践是检验真理的唯一标准:拷贝到pycharm一试便知。
一、类属性
1、类属性的创建:写在类里面函数外面
2、访问 类属性:
类的内部:self.类属性名称, 类.类属性名称
在类外面:类实例.类属性名称, 类.类属性名称
3、特点
1、类属性不需要实例化类就能进行访问
2、类属性也可以通过类实例进行访问
3、类实例访问类属性(如果实例属性与类属性同名),实例属性优先级比类属性高
二、实例属性
python 常用魔术方法详解
python 常用魔术方法详解
1、def init(self,name,age):
初始化方法,在类实例化的过程中自动执行
初始化函数的参数在类实例化的时候一起传入,传参方式和函数传参一致cl = TestDemo(age=20,name="郭德纲")
2、实例属性创建:实例属性定义在初始化函数__init__()中,使用self.变量名作为变量名
3、访问 实例属性:
类的内部:self.实例属性名称
在类外面:类实例.实例属性名称
类不能访问实例属性
4、特点
1 实例属性只能在实例化之后才能访问
2 类不能访问实例属性
class TestDemo:
# 类属性
name_1 = "刘德华"
age = 56
# 实例属性:初始化方法,在类实例化的过程中自动执行,不需要调用
def __init__(self, name, age): # self 类实例
print("__init__自动执行")
self.first_name = name
self.all_age = age
self.name_1 = "达芬奇"
def test_01(self):
# 类的内部:self.属性名称
print("姓名:", self.first_name) # 类的内部:self.实例属性名称
print("年龄:", self.all_age)
print("类内部:类.属性:", TestDemo.name_1) # 类的内部:类.类属性名称
print("类内部:self.属性:", self.age) # 类的内部:self.类属性名称
if __name__ == '__main__':
cl = TestDemo(age=20, name="郭德纲")
cl.test_01()
# __init__自动执行
# 姓名: 郭德纲
# 年龄: 20
# 类内部:类.属性: 刘德华
# 类内部:self.属性: 56
# 类实例访问类属性:类实例.类属性名称
print("类外面:cl.age:", cl.age)
# 类外面:cl.age: 56
# 类访问类属性:类.类属性名称
print("类外面:TestDemo.name_1:", TestDemo.name_1)
# 类外面:TestDemo.name_1: 刘德华
# 故类不能访问实例属性
# 类实例访问实例属性:类实例.实例属性
print("类外面:cl.name_1:", cl.name_1) # 在类外面:类实例.实例属性名称
# 类外面:cl.name_1: 达芬奇
# 故实例属性优先级比类属性高
# 类不能访问实例属性:类.实例属性
print("类外面:TestDemo.all_age:", TestDemo.all_age) # 在类外面:类实例.实例属性名称
# 会报错
# AttributeError: type object 'TestDemo' has no attribute 'all_age'
三、私有属性
1、在类的外面不能被访问的属性,私有属性只能在类的内部使用
2、私有属性通过双下划线开头进行定义:__name、 self.__age
3、强行访问
cl.dict: 获取对象的所有属性,在通过 类.属性名、类实例.属性名 调用。
print(TestDemo._TestDemo__name) 类.属性名
print(cl._TestDemo__age) 类实例.属性名
from pprint import pprint
class TestDemo:
# 双下划线开头 通常不能访问,特殊方法(获取属性名)能访问,道德素质上不要访问
__name = "钱包"
# 单下划线开头 通常能访问,道德上不要访问
_car = "车"
def __init__(self, age):
self.__age = age
def test_01(self):
print("self.__name:", self.__name)
print("self.__age:", self.__age)
if __name__ == '__main__':
cl = TestDemo(20)
cl.test_01()
# self.__name: 钱包
# self.__age: 20
# print(TestDemo.__name)
# # 打印会报错
# # AttributeError: type object 'TestDemo' has no attribute '__name'
# 单下划线开头 通常能访问,道德上不要访问
print("cl._car:", cl._car)
# cl._car: 车
# 获取类属性
pprint(TestDemo.__dict__)
# mappingproxy({'_TestDemo__name': '钱包',
# '__dict__': <attribute '__dict__' of 'TestDemo' objects>,
# '__doc__': None,
# '__init__': <function TestDemo.__init__ at 0x0000023C41508AE0>,
# '__module__': '__main__',
# '__weakref__': <attribute '__weakref__' of 'TestDemo' objects>,
# '_car': '车',
# 'test_01': <function TestDemo.test_01 at 0x0000023C4183C4A0>})
# 获取实例属性
print("cl.__dict__:", cl.__dict__)
# cl.__dict__: {'_TestDemo__age': 20}
# 通过查到的类属性 新key访问
print("TestDemo._TestDemo__name:", TestDemo._TestDemo__name)
# 通过查到的实例属性 新key访问
print("cl._TestDemo__age:", cl._TestDemo__age)
# 打印结果:
# TestDemo._TestDemo__name: 钱包
# cl._TestDemo__age: 20
欢迎来到testingpai.com!
注册 关于