1.一切皆对象,什么是一切皆对象?
- python中,创建一个学生类,也就是创建了一个类型叫学生类。
-
class Student: def __init__(self, x, y, z): self.name = x self.age = y self.gender = z def choose(self): pass obj1 = Student("liqi", 18, "male") print(type(obj1)) # <class '__main__.Student'> print(Student) # <class '__main__.Student'> # 上面这两个是一样的。
2.用样的,list也是一个类?
- 对的。
-
class Student: def __init__(self, x, y, z): self.name = x self.age = y self.gender = z def choose(self): pass obj1 = Student("liqi", 18, "male") print(type(obj1)) # <class '__main__.Student'> print(Student) # <class '__main__.Student'> # 上面这两个是一样的。 print(list) # <class 'list'> l1 = list([1,2,3]) print(l1,type(l1)) # [1, 2, 3] <class 'list'> l1.append(4) # 增加4 print(l1) list.append(l1,777) # 同样增加了,用类的方法,把obj传进去 print(l1) # [1, 2, 3, 4, 777]
View Code
3.property是什么?
- 是一个装饰器,用来把方法变为属性。
- 比如,BMI这个值,是计算出来的,以函数的形式存在,但我们想把这个变为属性,就用到property
- 代码示例:
-
class Student: def __init__(self, name, weight, height): self.name = name self.weight = weight self.height = height @property def bmi(self): # 计算BMI,公式为体重/身高的平方 # BMI = 75kg / (1.75m^2) return self.weight / (self.height ** 2) obj1 = Student("LIQI", 65, 1.6) print(obj1.bmi) # 但是bmi给人感觉是个数据,是个属性,而这里是个方法。 # 如何把这个方法变为属性呢?用到@property 把方法变为他的属性
-
4.那被property装饰后的隐藏name属性,在外部如何修改呢?
- 利用@name.setter
- 示例代码:
-
class Student: def __init__(self, name): self.__name = name # 把name保护起来 @property def name(self): return self.__name @name.setter # 像正常属性一样可以赋值 def name(self, new_name): self.__name = new_name @name.deleter # 不可以删除 def name(self): print("不允许删除~!") obj1 = Student("liqi") # 正常执行 print(obj1.name) obj1.name = "tutu" # 修改 print(obj1.name) del obj1.name # 删除
-
- 示例代码2(这样也可以)
-
class Student: def __init__(self, name): self.__name = name # 把name保护起来 def get_name(self): return self.__name def set_name(self, new_name): self.__name = new_name def del_name(self): print("11不允许删除~!") name = property(get_name, set_name, del_name) obj1 = Student("liqi") # 正常执行 print(obj1.name) obj1.name = "tutu" # 修改 print(obj1.name) del obj1.name # 删除
-
5.classmethod是什么?
- 被classmethod修饰过的函数,是绑定给类的方法。
- 正常的函数,是默认绑定给对象的方法。
- 绑定给谁就应该由谁来调用。
- 示例代码:
-
# 绑定方法 # 特点:绑定给谁就应该由谁来调用,谁来调用就会将自己当做第一个参数传入 # 非绑定方法 # 特点:不与类和对象绑定,意味着谁都可以来调用,但无论谁来调用就是一个普通函数,没有自动传参的效果 class People: def __init__(self, name): self.name = name # 但凡在类中定义一个函数,默认就是绑定给对象的,应该由对象来调用 # 调用时,会将对象作为第一个参数自动传入 def tell(self): print(self.name) # 类中定义的函数被classmethod装饰过,就绑定给类,应该由类来调用 # 调用时,会将类本身第一个参数自动传入 @classmethod def func(cls): print(cls) People.func() # <class '__main__.People'>
-
6.可以不绑定给任何类,也不绑定给对象吗?
- 可以。用staticmethod来实现。
7.staticmethod是什么?
- 不绑定类,也不绑定给对象,就是单纯的一个函数。
- 示例代码:
-
# 绑定方法 # 特点:绑定给谁就应该由谁来调用,谁来调用就会将自己当做第一个参数传入 # 非绑定方法 # 特点:不与类和对象绑定,意味着谁都可以来调用,但无论谁来调用就是一个普通函数,没有自动传参的效果 class People: def __init__(self, name): self.name = name # 但凡在类中定义一个函数,默认就是绑定给对象的,应该由对象来调用 # 调用时,会将对象作为第一个参数自动传入 def tell(self): print(self.name) # 类中定义的函数被classmethod装饰过,就绑定给类,应该由类来调用 # 调用时,会将类本身第一个参数自动传入 @classmethod def func(cls): print(cls) # 类中定义的函数被staticmethod装饰过,不绑定给任何,谁都可以来调用 # 调用时,当做普通函数来使用 @staticmethod def demo(x,y): print(x,y) # People.func() # <class '__main__.People'> People.demo(4,5) obj = People("tom") obj.demo(3,2)
-
8.什么时候用对象的方法,什么时候用类的方法?什么时候用静态方法(普通函数)?
- 他们的区别,也就是应用的不同。
- 示例:
- 场景1,类的参数,从配置文件导的时候。
- 场景2,对象,类都可以的调用,来生成uuid,不需要传参数。
- 示例代码:
-
import setting class People: def __init__(self, name, age, gender): self.name = name self.age = age self.gender = gender def tell_info(self): print(f'名字:{self.name},年龄:{self.gender},性别:{self.gender}') @classmethod def from_conf(cls): print("类的方法==>", cls) return cls(setting.NAME, setting.AGE, setting.GENDER) @staticmethod def creat_id(): import uuid return uuid.uuid1() p1 = People("tutu", 18, "male") # p2 = People.from_conf() # print(p2.__dict__) # {'name': 'liqi', 'age': 18, 'gender': 'female'} print(p1.creat_id()) # 对象可以来调用 print(People.creat_id()) # 类也可以来调用
-
参考资料
标签:__,进阶,--,self,绑定,Python,print,def,name From: https://www.cnblogs.com/liqi175/p/17082859.html