class Student(object): def __init__(self, name, score): self.name=name self.score = score def print_score(self): print("%s %s" %(self.name, self.score)) dd = Student('draymonder', 21) bb = Student('bing', 21) dd.print_score()
若是要讓內部屬性不被外部訪問,能夠把屬性的名稱前加上兩個下劃線__
,在Python中,實例的變量名若是以__
開頭,就變成了一個私有變量(private),只有內部能夠訪問,外部不能訪問python
其實是能夠訪問的,只是_
規範程序員以私有變量來使用
具體訪問以下程序員
class Student(object): def __init__(self, name, score): self.__name=name self.__score = score def print_score(self): print("%s %s" %(self.__name, self.__score)) dd = Student('draymonder', 21) print(dd._Student__name)
print(dd._Student__name)
sql
內置的@property裝飾器就是負責把一個方法變成屬性調用的編程
class Student(object): @property def birth(self): return self._birth @birth.setter def birth(self, vale): self._birth = value @property def age(self): return 2019 - self._birth s = Student() s._birth = 1998 print(s.age)
class Chain(object): def __init__(self, path=''): self._path = path def __getattr__(self, path): return Chain('%s/%s' % (self._path, path)) def __str__(self): return self._path __repr__ = __str__ print(Chain().status.user.timeline.list)
建立類app
def fn(self, name="world"): print("hello %s" %name) Hello = type("hello", (object,), dict(hello=fn)) #建立hello class
list添加add方法3d
class ListMetaclass(type): def __new__(cls, name, bases, attrs): attrs['add'] = lambda self,value: self.append(value) return type.__new__(cls, name, bases, attrs) class MyList(list, metaclass = ListMetaclass): pass L = MyList() L.add(1) L.add(2) L.add(3) print(L)
class ModelMetaclass(type): def __new__(cls, name, bases, attrs): if name=='Model': return type.__new__(cls, name, bases, attrs) print('Found model: %s' % name) mappings = dict() for k, v in attrs.items(): if isinstance(v, Field): print('Found mapping: %s ==> %s' % (k, v)) mappings[k] = v for k in mappings.keys(): attrs.pop(k) attrs['__mappings__'] = mappings # 保存屬性和列的映射關係 attrs['__table__'] = name # 假設表名和類名一致 return type.__new__(cls, name, bases, attrs) class Model(dict, metaclass=ModelMetaclass): def __init__(self, **kw): super(Model, self).__init__(**kw) def __getattr__(self, key): try: return self[key] except KeyError: raise AttributeError(r"'Model' object has no attribute '%s'" % key) def __setattr__(self, key, value): self[key] = value def save(self): fields = [] params = [] args = [] for k, v in self.__mappings__.items(): fields.append(v.name) params.append('?') args.append(getattr(self, k, None)) sql = 'insert into %s (%s) values (%s)' % (self.__table__, ','.join(fields), ','.join(params)) print('SQL: %s' % sql) print('ARGS: %s' % str(args)) # Field(name, column_type) class Field(object): def __init__(self, name, column_type): self.name = name self.column_type = column_type def __str__(self): return "<%s:%s>" %(self.__class__.__name__, self.name) class StringField(Field): def __init__(self, name): super(StringField, self).__init__(name, 'varchar(100)') class IntegerField(Field): def __init__(self, name): super(IntegerField, self).__init__(name, 'bigint') class User(Model): id = IntegerField("id") name = StringField("username") email = StringField("email") password = StringField("password") u = User(id=1,name="draymonder",email="93958042@qq.com",password="IloveU") u.save()
python面向對象編程code