-
1、如果类属性和实例属性名字相同时,实例属性的优先级要高于类属性
2、通过实例无法修改类的属性
查看全部 -
如果希望导入模块的指定部分属性或函数,那么使用from...import...语句。
使用from ... import as ...语句,as类似重命名,可以把导入的函数或属性重命名为别的名字。
查看全部 -
如果把一个类实例也变成一个可调用对象,可以实现一个特殊的方法__call__()。
>>> p = Person('Bob', 'Male')
>>> p('Alice') # ==> 用函数的方式调用Person类的实例p
查看全部 -
由于Python是动态语言,任何实例在运行期都可以动态地添加属性。
如果要限制添加的属性,就可以利用Python的一个特殊的__slots__来实现。
查看全部 -
__add__、__sub__、__mul__、__truediv__ 加减乘除
class Rational(object):
def __init__(self, p, q):
self.p = p
self.q = q
def __add__(self, r):
return Rational(self.p * r.q + self.q * r.p, self.q * r.q)
def __str__(self):
return '{}/{}'.format(self.p, self.q)(1)p分子,q分母
(2)self.p * r.q + self.q * r.p 新分子 = (当前分子 * 另一个分母) + (当前分母 * 另一个分子)
(3)self.q * r.q分母乘分母
(4)将新分子分母替换原来的p,q
2.地板除的特殊方法是__floordiv__,普通除法是__truediv__。地板除法和普通除法不一样,地板除法的结果只会向下取整数。
3.在运算中,普通除法使用/表示,而地板除使用//表示。
查看全部 -
对于列表List或者元组Tuple,通过内建方法len(),可以得出列表或者元组中元素的个数。
如果一个类表现得像一个list,想使用len()函数来获取元素个数时,则需要实现__len__()方法。
查看全部 -
对于Python的内建对象,比如int、dict、list等,通过str()方法,可以把这些对象转换为字符串对象输出。
#########################################################
class Person:
pass
bob = Person()
str(bob) # ==> '<__main__.Person object at 0x7fc77b859c50>'#########################################################
(1)<__main__.Person object at 0x7fc77b859c50>这个结果其实是Animal的实例cat在内存中的地址
2.如果我们的类也想把容易理解的字符串输出的话,那么我们也需要实现类的 __str__()方法。
3.当我们直接打印实例化对象的时候,调用的是__str__方法(用户)的返回 结果,当我们在终端中调用实例化对象的时候,得到确实__repr__ 方 法 (开发者)的返回结果。
查看全部 -
通过type()函数,可以获得变量的类型。
通过dir()方法,可以获取变量的所有属性。
在dir列出的属性中,有很多是以下划线开头和结尾的,这些都是特殊的方法,称为内建方法。
########################################################
class Person(object):
def __init__(self, name, gender):
self.name = name
self.gender = gender
def who(self):
return 'I am a Person, my name is {}'.format(self.name)
p = Person('Alice', 'Female')
dir(p)########################################################
对于实例变量,dir()返回所有实例属性,包括__class__这类有特殊意义的属性。注意到方法who也是p的一个属性。
4.dir()返回的属性是字符串列表,如果已知一个属性名称,要获取或者设置对象 的属性,就需要用 getattr() 和 setattr( )函数了。
(1)getattr() :获取某一对象属性
(2) setattr( ):设置新的属性
查看全部 -
在定义继承类的时候,有几点是需要注意的:
1.class Student()定义的时候,需要在括号内写明继承的类Person
2.在__init__()方法,需要调用super(Student, self).__init__(name, gender),来初始化从父类继承过来的属性
查看全部 -
如果需要操作类的私有属性,则应该定义类的方法。
默认的,在class中定义的全部是实例方法。
和实例方法不同的是,这里有两点需要特别注意:
(1)类方法需要使用@classmethod来标记为类方法,否则定义的还是实例方法
(2)类方法的第一个参数将传入类本身,通常将参数名命名为 cls,上面的 cls.__localtion 实际上相当于Animal.__localtion。
查看全部 -
那如果外部需要操作私有属性怎么办?这个时候可以通过定义类或者实例的方法来操作私有属性
实例的方法指的就是在类中定义的函数
实例方法的第一个参数永远都是self,self是一个引用,指向调用该方法的实例对象本身
4.#####################
class Person():
def __init__(self,name):
self.__name = name #name是私有的
def get_name(self):
return self.__name #实例方法操作私有属性p = Person('Alice')
print(p.get_name()) # ==> Alice
#####################################(1)__init__(self, name)其实也可看做是一个特殊的实例方法。
(2)通过定义get_name(self)方法,在外部就可以通过这个方法访问私有属性了。
5.通过定义实例方法来操作私有属性这种数据封装的形式除了能保护内部数据一 致性外,还可以简化外部调用的难度。
6.实例方法并不仅仅是为私有属性服务的,我们可以把和类的实例有关的操作
都抽象成实例方法 比如:打印实例的详细信息等等。
查看全部 -
私有属性是以双下划线'__'开头的属性。
私有属性是为了保护类或实例属性不被外部污染而设计的。
查看全部 -
在类属性和实例属性同时存在的情况下,实例属性的优先级是要高于类属性的
查看全部 -
# Enter a code
class Person(object):
pass
class Student(Person):
def __init__(self, name, age):
self.name = name
self.age = age
class Teacher(Person):
def __init__(self, name, age):
self.name = name
self.age = age
class SkillMixin(object):
pass
class BasketballMixin(SkillMixin):
def skill(self):
return 'basketball'
class FootballMixin(SkillMixin):
def skill(self):
return 'football'
class Basketball_Student(Student,BasketballMixin):
def __init__(self,name,age):
super(Basketball_Student,self).__init__(name,age)
class Football_Teacher(Teacher,FootballMixin):
def __init__(self,name,age):
super(Football_Teacher,self).__init__(name,age)
s = Basketball_Student('eric',24)
print('I am {},I like playing {}'.format(s.name,s.skill()))
查看全部 -
和实例方法不同的是,这里有两点需要特别注意:
1.类方法需要使用@classmethod来标记为类方法,否则定义的还是实例方法
2.类方法的第一个参数将传入类本身,通常将参数名命名为 cls,上面的 cls.__localtion 实际上相当于Animal.__localtion。
查看全部
举报