受保护属性名以一个下划线开头
私有属性名以两个下划线开头
class Person:
nationality = "CHINA" #pubilc属性
_deposit = 10e10 #protected属性
__gender = 'M' #private属性
三个重要函数
- _ _ init _ _() :初始化函数
- _ _ new _ _():构造函数
- _ _ del _ _():析构函数
class Person:
def __init__(self, name, age):
self.name = name # 实例属性,类内属性不需要事先声明
age = age # 局部变量
def say_hello(self):
print(self.name)
p1 = Person("小明", 18)
p1.say_hello() # 小明
类中的三种方法
- 实例方法(类似普通的方法,形参不同,第一个参数必须为位置参数self)
- 类方法(第一个参数必须为类的引用cls)在方法前加@classmethod
- 静态方法(没有self和cls,甚至没有任何参数)在方法前加@staticmethod
类方法和静态方法均可通过对象名和类名访问
class Person:
def __init__(self, name, age):
self.name = name # 实例变量,类内属性不需要事先声明
age = age # 局部变量
def say_hello(self):
print(self.name)
@classmethod
def say_hi(cls):
print("hi")
@staticmethod
def say_yeah():
print("yeah")
p1 = Person("小明", 18)
p1.say_hello() # 小明
Person.say_hi() # hi
p1.say_hi() # hi
Person.say_yeah() # yeah
p1.say_yeah() # yeah
继承:class 子类名(父类名)
可以继承protected属性,不能继承private属性
class Person:
_nationality = "CHINA"
def __init__(self, name, age):
self.name = name # 实例变量,类内属性不需要事先声明
age = age # 局部变量
def say_hello(self):
print(self.name)
class Teacher(Person):
pass
t1 = Teacher("小红" , 20)
t1.say_hello() # 小红
print(t1._nationality) # CHINA
通过装饰器来访问私有变量,要带self
@property装饰器
class Person:
_nationality = "CHINA"
__gender = 'F'
def __init__(self, name, age):
self.name = name # 实例变量,类内属性不需要事先声明
age = age # 局部变量
@property
def get_gender(self):
print(self.__gender)
p1 = Person("小明", 18)
print(p1.name) # 小明
p1.get_gender # F
class Person:
nationality = "CHINA" # 类属性
gender = 'F' # 类属性
def __init__(self):
pass
p1 = Person()
p2 = Person()
print(p1.nationality, p1.gender) # CHINA F
print(p2.nationality, p2.gender) # CHINA F
p1.nationality = "USA" # 修改的是对象的属性
Person.nationality = "UK" # 修改的类的属性
print(p1.nationality, p1.gender) # USA F
print(p2.nationality, p2.gender) # UK F
new()与init()
当_ _ new _ _()中的return语句执行之后才执行 _ _ init _ _()
#若new函数无返回值,则init不会被调用
class Person:
def __new__(cls, *args, **kwargs):
print("new被调用")
def __init__(self):
print("init被调用")
p = Person() # new被调用
为了是 _ _ init _ _ () 能被执行,在_ _ new _ ()最后增加return object. _ new_ _ (cls)
class Person:
def __new__(cls, *args, **kwargs):
print("new被调用")
return object.__new__(cls)
def __init__(self):
print("init被调用")
p = Person()
# new被调用
# init被调用