目录
1,类和实例
2,类方法与静态方法
3,访问控制
4,属性装饰器
1,类和实例
# 类和实例的关系:类是一个抽象的对象,实例是一个具体的对象。例如“人”是一个抽象的类,而“小明”是一个具体的实例。由类获得实例的过程称为类的实例化。
class class_name: # 使用class关键字定义了一个类,它的名字是class_name
class_attrib1 = variable1 # class_attrib1是一个类变量,它的值是variable1
class_attrib2 = variable2 # 类变量在实例中共享,相当于所有实例的共有属性,这些属性在实例化类时会被自动赋予。
class_attrib3 = variable3 # 通过实例修改类变量不会影响其他实例的类变量值。通过类修改类变量会影响所有未通过实例修改该变量的实例的类变量值。
def __init__(self, variable1, variable2): # __init__的作用是完成实例的初始化,在实例化类时它会被隐式调用。实例化类时需要为除self外的形参传入值。
self.attrib1 = variable1 # self.attrib1是一个实例变量,它的的值是variable1
self.attrib2 = variable2 # 实例变量是每一个实例特有的属性,它的值在初始化时被赋予,对这个值的修改只能通过实例进行
pass # self(可以是其他名字)代指实例本身,它必须是方法的第一个参数,调用类中的方法时不需要为这个参数传入值。
def function(self, variable): # 这是一个具体的方法,通过它让实例实现某些功能
function_body
class chinese: # 定义了一个类,它的名字是chinese
country = 'china' # 每一个chinese的实例都具有两个属性:country和virtue
virtue = 'honest'
def __init__(self, name, height): # 每一个chinese的实例都具有独特的name,height
self.name = name
self.height = height
def greet(self): # 定义了一个greet方法
print(f"你好,我的名字是{self.name},很高兴认识你")
def learn(self, interest):
print(f"我想要学习{interest}") # 定义了一个learn方法
xiao_ming = chinese('小明', 175) # 创建了两个实例对象
xiao_hong = chinese('小红', 165)
2,类方法与静态方法
class employee:
employee_book = {'小明': 175, '小红': 165, '小张': 180}
def __init__(self, name, height):
self.name = name
self.height = height
self.new_employee(self.name, self.height)
def greet(self): # 实例方法
print(f"你好,我叫{self.name},很高兴认识你")
@classmethod # 类方法定义前加上@classmethod
def print_employee_book(cls): # cls(可以是其他名字)代指这个类,它必须是类方法的第一个参数,调用类方法时不需要为这个参数传入值。
for name, height in cls.employee_book.items():
print(name, height)
@classmethod
def new_employee(cls, name, height):
cls.employee_book[name] = height
@staticmethod # 静态方法定义前加上@staticmethod
def class_introduce(): # 静态方法不必传入self或cls
print('这个类用于记录员工的姓名和身高.') # 静态方法可以不涉及具体的实例和类本身,将它放在类里主要是因为它做的事与类有关。
@staticmethod
def sum_height(employee1, employee2):
print(employee1.height + employee2.height)
employee.print_employee_book() # 类方法的两种调用
xiao_wang = employee('小王', 170)
xiao_wang.print_employee_book()
xiao_wang.greet() # 实例方法的两种调用
employee.greet(xiao_wang)
employee.class_introduce() # 静态方法的两种调用
xiao_li = employee('小李', 185)
xiao_wang.sum_height(xiao_wang, xiao_li)
3,访问控制
class student:
country = 'china' # 没有特殊处理的变量名/方法名
def __init__(self, name):
self._name = name # 以下划线开头的变量名/方法名,仍然可以被类和实例访问(解释器没有做任何改变,但一般约定不要直接访问这样的变量/方法)
def __greet(self): # 以双下划线开头的变量名/方法名,只能被类访问。要让实例访问,需要在变量名/方法名前加上'_classname'
print(f"你好,我叫{self._name},很高兴认识你。")
def use_greet(self):
self.__greet()
xiao_ming = student('小明')
print(xiao_ming._name)
xiao_ming._student__greet()
xiao_ming.use_greet()
4,属性装饰器
# 属性装饰器作用:①把方法当成属性来访问更方便;②通过方法调用“private”的属性,一方面简化了访问,另一方面隐藏了原本的属性名,可以避免被随意修改
class people:
def __init__(self, age):
self.__age = age # 使用双下划线开头,使得变量只能被类直接访问
@property # @property:只读
def age(self):
return self.__age
@age.setter # @function_name.setter:可以修改
def age(self, newage):
self.__age = newage
@age.deleter # @age.deleter:可以删除
def age(self):
del self.__age
xiao_ming = people(18)
print(xiao_ming.age) # 注意不是xiao_ming.age()
xiao_ming.age = 20 # 没有@age.setter会报错:AttributeError: can't set attribute
print(xiao_ming.age)
del xiao_ming.age # 没有@age.deleter会报错:AttributeError: can't delete attribute
# print(xiao_ming.age) # 报错:AttributeError: 'people' object has no attribute '_people__age'
|