class Student:
def __init__(self, name, tel, study_id='0001', score=0):
self.name = name
self.tel = tel
self.study_id = study_id
self.score = score
def __repr__(self):
return f'<{str(self.__dict__)[1:-1]}>'
p1 = Student('张三', '120', '0005', 60)
print(p1)
"""
对象.属性
getattr(对象, 属性名)
"""
""""
对象.属性 = 值
setattr(对象,属性名,值)
"""
"""
del 对象.属性
delattr(对象,属性名)
"""
"""
1)对象方法
怎么定义:直接定义
怎么调用:对象.方法名()
特点:self
什么时候用:如果实现函数的功能需要用到对象属性,那么这个函数就定义成对象方法
2)类方法
怎么定义:在定义函数前加装饰器@classmethod
怎么调用:类.方法名()
特点:有个默认参数cls,这个参数在调用的时候不用传参,系统会自动将当前类传给cls
什么时候用:实现函数的功能在不需要对象属性的前提下需要类就使用类方法
3)静态方法
怎么定义:在定义函数前加装饰器@staticmethod
怎么调用:类.方法名()
特点:没有默认参数(相当于类中的普通函数)
什么时候用:实现函数的功能在不需要对象属性的前提下不需要类就使用静态方法
"""
class Student:
num = 100
def __init__(self, name='张三'):
self.name = name
def func1(self):
print(self.name, Student.num)
@classmethod
def func2(cls):
print(f'cls: {cls}')
print('类方法')
stu1 = Student()
stu2 = cls()
print(stu1, stu2)
print(cls.num)
@staticmethod
def func3():
print('静态方法')
print(Student.num)
@staticmethod
def func4():
print('你好吗?')
print('Student:', Student)
Student.func2()
Student.func3()
s = Student()
s.func1()
class Person:
"""
人类
"""
num = 61
def __init__(self, name='张三', age=18, gender='男'):
self.name = name
self.age = age
self.gender = gender
def eat(self, food='面条'):
print(f'{self.name}在吃{food}')
@classmethod
def message(cls):
print(f'人类目前的数量是:{cls.num}')
@staticmethod
def destroy():
print('人类破坏环境!')
p1 = Person()
print(Person.__doc__)
print(Person.__module__)
print((10).__class__)
print(Person.__class__)
print(Person.__name__)
print(print.__name__)
print(Person.__dict__)
print(p1.__dict__)
print(Person.__base__)
import time
"""
1)getter
什么时候用:在获取对象属性前,如果要别的什么事情,就可以给这个属性添加getter
怎么用:
第一步:在需要添加getter的属性的属性名前加_
第二步:在@property后面定义一个函数,
函数名就是属性名去掉_
函数没有参数,需要一个返回值(返回值就是获取这个属性真正得到的结果)
第三步:通过对象获取属性的时候,属性不需要带_
2)setter - 添加setter之前必须先添加getter
什么时候用:如果要给某个对象属性赋值之前做别的什么事情,就给这个属性添加setter
怎么用:
第一步:在需要添加setter的属性的属性名前加_
第二步:在装饰器@getter名.setter后面定义一个函数:
函数名就是属性名去掉_
函数有一个参数(这个参数指向的是赋值的时候赋的值),没有返回值
第三步:通过对象给属性赋值的时候,属性不需要带_
"""
class Person:
def __init__(self):
self._birth = 1823828290
self._age = 19
self.gender = '男'
@property
def birth(self):
t1 = time.localtime(self._birth)
ts = time.strftime('%Y-%m-%d', t1)
return ts
@property
def age(self):
if self._age <= 4:
return '儿童'
elif self._age <= 12:
return '少年'
elif self._age <= 28:
return '青年'
elif self._age <= 40:
return '壮年'
elif self._age <= 55:
return '中年'
else:
return '老年'
@age.setter
def age(self, value):
print(f'value:{value}')
if type(value) != int:
raise ValueError
if value < 0 or value > 150:
raise ValueError
self._age = value
p1 = Person()
print(p1.birth)
print(p1.age)
p1.gender = '女'
p1.gender = 100
p1.gender = [10, 20, 30]
p1.age = 123
"""
1)三种访问权限
公开的:公开的属性和方法在类的内部、外部都可以用,并且可以被继承
保护的:保护的属性和方法在类的内部可以使用,外部不能用,但是可以被继承
私有的:私有的属性和方法在类的内部可以用,外部不能用,不能被继承
python中的属性和方法只有一种访问权限:公开的,所谓的私有化其实是假的
私有化方法:在属性名和方法名前加__(注意:只能是两个__开头,不能再用__结尾)
"""
class Person:
num = 100
__info = '动物'
def __init__(self):
self.name = '张三'
self.__age = 18
def func0(self):
print(self.__age)
@staticmethod
def func1():
print(Person.num)
print(Person.__info)
@staticmethod
def __func2():
print('你好,世界!')
print(Person.num)
Person.func1()
p1 = Person()
p1.func0()
print(p1.__dict__)
"""
python在使用运算符的时候本质是在调用运算符对应的方法。
每个运算符对应的方法的方法名是固定的,不同类型的数据在参与相同运算的时候,会调用不同类中对应的方法。
某个类型的数据是否支持某种运算,就看这个数据对应的类型中有没有实现这个运算符对应的方法
"""
class Person:
def __init__(self, name='小明', age=18, gender='男'):
self.name = name
self.age = age
self.gender = gender
def __repr__(self):
return f'<{str(self.__dict__)[1:-1]}>'
def __add__(self, other):
return self.name + other.name
def __mul__(self, other):
return [self for _ in range(other)]
def __mod__(self, other):
pass
p1 = Person()
p2 = Person('小花', 28, '女')
print(p1 + p2)
print(p1 * 4)
print(p1 % p2)
p1 = Person()
p2 = Person('小花', 28, '女')
p3 = Person('张三', 20, '男')
p4 = Person('老王', 25, '男')
ps = [p1, p2, p3, p4]
print(ps)
ps.sort(key=lambda item: item.age)
print(ps)